#include "StdMysql.h"
#include <iostream>

StdMySql::StdMySql()
{
    isConnected = false;
    mysql_init(&mysql);
}

StdMySql::~StdMySql()
{
    if(isConnected)
        mysql_close(&mysql);
}

bool StdMySql::Connect(CStrRef host, CStrRef user, CStrRef passwd, CStrRef dbName, int port)
{
    
    if(!mysql_real_connect(&mysql,host.c_str(),user.c_str(),passwd.c_str(),dbName.c_str(),port,nullptr,0))
    {
        std::cout<<"connec error : "<<mysql_error(&mysql)<<std::endl;
        return false;
    }
    isConnected = true;
    return true;
}

bool StdMySql::Exec(CStrRef sql)
{
    if(mysql_real_query(&mysql,sql.c_str(),sql.size()))
    {
        std::cout<<"语句执行失败\n";
        std::cout<<mysql_error(&mysql)<<std::endl;
        return false;
    }
    return true;
}

StrMatrix StdMySql::GetSqlResult(CStrRef sql)
{
    if(!Exec(sql))
        return {};
    MYSQL_RES *result = mysql_store_result(&mysql);
    StrMatrix res;
    if(result)
    {
        int fieldCount = mysql_field_count(&mysql);//获取列数
        char ** sql_row;
        while((sql_row = mysql_fetch_row(result) )!= nullptr)//按行拿数据
        {
            std::vector<std::string> vec;
            for(int i = 0;i < fieldCount;i++)
            {
                vec.push_back(sql_row[i]);
            }
            res.push_back(std::move(vec));// 移动语义
        } 
        //释放结果集
        mysql_free_result(result);
    }
    return res;
}

bool StdMySql::StartTransaction()
{
    return !mysql_autocommit(&mysql,false);// 为0代表成功
}

bool StdMySql::Commit()
{
    mysql_commit(&mysql);
    return !mysql_autocommit(&mysql,true);
}

bool StdMySql::Rollback()
{
    mysql_rollback(&mysql);
    return !mysql_autocommit(&mysql,true);
}
